/***********************************************************************************
 * 文件名： ui_ctrl.h
 * 版本： 1
 * 说明：
 * 		UI控制器，处理UI的切换、提供定时器。
 * 修改记录：
 * 	2024/01/10: 初版。 刘言。
***********************************************************************************/
#ifndef _UI_CTRL_H_
#define _UI_CTRL_H_

#include "page_logo.h"
#include "page_warn.h"
#include "page_menu.h"
#include "page_num_main.h"
#include "page_num_video.h"
#include "page_num_charge.h"
#include "ui_type.h"
#include "polsys.h"


extern polsys_task_t PublicTimer;


/**
 * 初始化UI显示。
*/
void Ui_Init();

/**
 * 创建并加载默认页面，将会删除当前页面（若有）
 * 确保在页面创建函数中不要再次调用页面创建函数！
*/
void Ui_LoadDefaultPage();

/**
 * 创建并切换到页面，会依次触发 UNLOADED LOADED 事件
 * 注意：确保在页面创建函数中不要再次调用页面创建函数；避免调用之后任然还在操作之前页面的数据（可能需要添加return）。
 * @param creat_fun 期望切换到的页面创建函数。
 * @param param 页面创建函数的参数，通常用于上一个页面给下一个页面传递数据，作为页面的一个初始参数
*/
void Ui_SwitchToPage(ui_page_creat_fun_t creat_fun, void *param);

/**
 * 创建并加载新页面。通常不需要调用。
 * 注意，不要重复创建页面，先确保当前页已被清除后再创建。确保在页面创建函数中不要再次调用页面创建函数！
*/
void Ui_Load(ui_page_creat_fun_t creat_fun, void *param);

/**
 * 清除当前页面，腾出内存空间。通常不需要调用。
*/
void Ui_Clear();

/**
 * 通知事件到UI前台页面
*/
void Ui_NotifyEvent(ui_ev_code_t ev_code);

/**
 * 获取当前页面句柄
*/
ui_page_base_t *Ui_GetNowPage();


STATIC_FORCE_IN_LINE void Ui_PageBaseInit(ui_page_base_t * page)
{
    memset(page, 0, sizeof(ui_page_base_t));
}

/**
 * 设置页面删除函数，在页面需要被删除时会被调用。如果不设置，将仅执行 free(page)。
*/
STATIC_FORCE_IN_LINE void Ui_PageSetDeleteFun(ui_page_base_t * page, ui_page_delete_fun_t delete_fun)
{
    page->DeleteFun = delete_fun;
}

STATIC_FORCE_IN_LINE void Ui_PageSetCb(ui_page_base_t * page, ui_cb_t cb)
{
    page->CallBack = cb;
}

#endif
